package modelo.naves;

import static modelo.SetUps.ENERGIA_ALGO42;
import static modelo.SetUps.VELOCIDAD_ALGO42;
import static modelo.SetUps.RADIO_ALGO42;



import vista.VistaFactory;
import vista.VistaMovil;



import modelo.Movil;
import modelo.armas.*;
import modelo.desplazadores.DesplazadorAlgo42;
import modelo.util.Vector;

/*
 * esta clase modela el comportamiento de la nave 
 * del jugador
 */
public class NaveAlgo42 extends Naves{
	
	protected boolean disparar; //Por si debe o no disparar al actuar
	Armas arma;
	
	
	public NaveAlgo42(Vector pos, Vector dir){
		energia = new EnergiaLineal(ENERGIA_ALGO42);
		arma = new Laser (new BandoAlgo42());
		desplazador = new DesplazadorAlgo42(pos, dir, VELOCIDAD_ALGO42);
		radio = RADIO_ALGO42;
	}
	
	public Movil actuar() {
		desplazador.mover();
		return this.disparar();
	}
	
	public void chocarCon (Movil obj) {
		if ( this.chocaCon(obj) ) 
			obj.chocarConAlgo42(this);
	}

	public void chocarConAlgo42(NaveAlgo42 algo42) {
		//Nada
	}
	
	public void chocarConBalaAlgo42(BalasAlgo42 unaBala) {
		//Nada
	}

	public void chocarConBalaEnemiga(BalasEnemigas unaBala) {
		this.chocarConBala(unaBala);		
	}

	/*
	 * al chocar con una nave autonoma ambas naves deben morir
	 */
	public void chocarConNaveAutonoma(NavesAutonomas unaNave) {
		if (this.seguirActuando() ){
			unaNave.chocarConAlgo42(this);
			this.morir();
		}
	}

	public void chocarConPickUp(PickUp unPickUp) {
		unPickUp.chocarConAlgo42(this);
	}
	
	public Movil disparar(){
		if (disparar) {
			disparar = false;
			if (puedeSeguirDisparando()){
				return arma.disparar (this.getPosicion(), this.getDireccion());
			}
		}
		return null;
	}

	public boolean puedeSeguirDisparando(){
		if ( !arma.puedeSeguirDisparando()){
			this.reiniciarArma();
		}
		return arma.puedeSeguirDisparando();
	}
	
	/*
	 * esto si porque el algo 42 puede tomar otras armas,
	 * cuando estas se acaban vuelve al laser
	 */
	private void reiniciarArma(){
		arma = new Laser (new BandoAlgo42());
	}
	
	public void tomarArma( Armas unArma) {
		arma = unArma;
	}
	
	public Armas getArma() {
		return arma;
	}

	public void tomarEnergia(EnergiaLineal unaEnergia) {
		energia = energia.sumar(unaEnergia);
	}

	public void chocarConRadarEnemigo(RadarEnemigo unRadar) {
		unRadar.chocarConAlgo42(this);
		
	}

	public void chocarConRadarAlgo42(RadarAlgo42 unRadar) {
		// nada		
	}
	
	public void setDirProxMov(Vector dir){
		((DesplazadorAlgo42)desplazador).setDirProxMov(dir);
	}
	
	public void setDisparo(){
		disparar = true;
	}
	
	public VistaMovil getVista (VistaFactory vistaFactory){
		return vistaFactory.getVistaAlgo42(this);
	}
		
}